/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.ufrn.cerescaico.sepe.actions;

import br.ufrn.cerescaico.sepe.beans.Atividade;
import br.ufrn.cerescaico.sepe.beans.Email;
import br.ufrn.cerescaico.sepe.beans.Participante;
import br.ufrn.cerescaico.sepe.beans.Perfil;
import br.ufrn.cerescaico.sepe.beans.Usuario;
import br.ufrn.cerescaico.sepe.bo.SepeException;
import br.ufrn.cerescaico.sepe.util.Constantes;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;

/**
 *
 * @author Taciano
 */
public class ParticipanteAction extends SepeAction {
    
    /**
     * Logger.
     */
    private Logger logger = Logger.getLogger(ParticipanteAction.class);

    /**
     * Login do usuário.
     */
    private String username;

    /**
     * Senha do usuário.
     */
    private String password;

    /**
     * Participante selecionado.
     */
    private Participante participante;

    /**
     * Lista de participantes.
     */
    private List<Participante> participantes;
    
    private String SOLICITAR_EDICAO = "solicitarEdicao";
    private String SOLICITAR_INSCRICOES = "solicitarInscricoes";

    private Atividade ativ19d13h;
    private List<Atividade> ativs19d13h = new ArrayList<Atividade>();

    private Atividade ativ19d19h;
    private List<Atividade> ativs19d19h = new ArrayList<Atividade>();

    private Atividade ativ20d13h;
    private List<Atividade> ativs20d13h = new ArrayList<Atividade>();

    private Atividade ativ20d19h;
    private List<Atividade> ativs20d19h = new ArrayList<Atividade>();

    private Atividade ativ21d13h;
    private List<Atividade> ativs21d13h = new ArrayList<Atividade>();

    private Atividade ativ21d19h;
    private List<Atividade> ativs21d19h = new ArrayList<Atividade>();

    private Atividade ativ22d13h;
    private List<Atividade> ativs22d13h = new ArrayList<Atividade>();

    private Atividade ativ22d19h;
    private List<Atividade> ativs22d19h = new ArrayList<Atividade>();

    private String INSCRITO = "Inscrito";

    private String CADASTRADO = "Cadastrado";

    private String INSCRICAO_OK = "InscricaoOk";

    private String INSCRICAO_OK_2 = "InscricaoOk2";

    private List<Atividade> atividades = new ArrayList<Atividade>();

    public List<Atividade> getAtividades() {
        return atividades;
    }

    public void setAtividades(List<Atividade> atividades) {
        this.atividades = atividades;
    }

    private ArrayList<String> uf;

    public ParticipanteAction() {
        uf = new ArrayList<String>();
        uf.add("AC");uf.add("AL");uf.add("AM");uf.add("AP");uf.add("BA");uf.add("CE");uf.add("DF");uf.add("ES");
        uf.add("GO");uf.add("MA");uf.add("MG");uf.add("MS");uf.add("MT");uf.add("PA");uf.add("PB");uf.add("PE");
        uf.add("PI");uf.add("PR");uf.add("RJ");uf.add("RN");uf.add("RO");uf.add("RR");uf.add("RS");uf.add("RS");
        uf.add("SE");uf.add("SP");uf.add("TO");
        try {
            setAtivs20d13h(getSepe().listarAtividades("20d13h"));
            setAtivs20d19h(getSepe().listarAtividades("20d19h"));
            setAtivs21d13h(getSepe().listarAtividades("21d13h"));
            setAtivs21d19h(getSepe().listarAtividades("21d19h"));
            setAtivs22d13h(getSepe().listarAtividades("22d13h"));
            setAtivs22d19h(getSepe().listarAtividades("22d19h"));
        } catch (SepeException ex) {
            logger.error(ex.getMessage(), ex);
            addActionError(getText(ex.getMessage()));
            setAtivs20d13h(new ArrayList<Atividade>());
            setAtivs20d19h(new ArrayList<Atividade>());
            setAtivs21d13h(new ArrayList<Atividade>());
            setAtivs21d19h(new ArrayList<Atividade>());
            setAtivs22d13h(new ArrayList<Atividade>());
            setAtivs22d19h(new ArrayList<Atividade>());
        }
    }

    /**
     * Verifica a entrada do formulário de registro e encaminha para a página
     * principal se não houver erro.
     * @see com.opensymphony.xwork2.ActionSupport#execute()
     */
    @Override
    public String execute() throws Exception {
        try {
            logger.info("execute()");
            setParticipantes(getSepe().listarPartOrdenadoPorEmail());
        } catch (SepeException ex) {
            logger.error(ex.getMessage(), ex);
            addActionError(getText(ex.getMessage()));
        }
        return SUCCESS;
    }

    public List<Participante> getParticipantes() {
        return participantes;
    }

    public void setParticipantes(List<Participante> participantes) {
        this.participantes = participantes;
    }

    public String solicitarEdicao() {

        Usuario usuario = null;

        if (!isInvalid(getUsername()) && !isInvalid(getPassword())) {
            try {
                usuario = getSepe().autenticarUsuario(getUsername(), getPassword());
            } catch (SepeException e) {
                logger.error(e.getMessage(), e);
                addActionError(getText(e.getMessage()));
                return INPUT;
            }
        } else {
            addFieldError("username", getText("view.usuario.invalidos"));
            return INPUT;
        }

        try {
            participante = getSepe().autenticarParticipante(getUsername(), getPassword());
        } catch (SepeException e) {
            logger.error(e.getMessage(), e);
            addActionError(getText(e.getMessage()));
            return INPUT;
        }

        if (usuario == null) {
            if (participante != null) {
                //Criar usuário
                Usuario newuser = new Usuario();

                newuser.setLogin(participante.getEmail());
                newuser.setSenha(participante.getSenha());
                newuser.setNome(participante.getNome());
                newuser.setEmail(participante.getEmail());
                try {
                    newuser.setPerfil(getSepe().buscarPerfil(Perfil.PARTICIPANTE).getNome());
                    getSepe().incluirUsuario(newuser);
                    usuario = newuser;
                } catch (SepeException e) {
                    logger.error(e.getMessage(), e);
                    addActionError(getText(e.getMessage()));
                    return INPUT;
                }
            }
        }

        getSepe().setUsuarioSessao(usuario);

        if (usuario == null && participante == null) {
            addFieldError("username", getText("view.usuario.invalidos"));
            return INPUT;
        }

        addActionMessage("Todas as inscrições foram encerradas!");
        //setAtividades(getSepe().listarAtividades(getParticipante()));
        return INSCRICAO_OK_2;
    }

    public String alterarParticipante() throws Exception {
        try {
            logger.info("alterarParticipante()");
            if (getParticipante() == null || getParticipante().getId() == null) {
                throw new SepeException("erro.action.participante.alterar");
            }
            if (getParticipante().getEmail() == null || "".equals(getParticipante().getEmail())) {
                throw new SepeException("erro.action.participante.alterar.email");
            }
            if (getParticipante().getNome() == null || "".equals(getParticipante().getNome())) {
                throw new SepeException("erro.action.participante.alterar.nome");
            }
            if (getParticipante().getNomeCracha() == null || "".equals(getParticipante().getNomeCracha())) {
                throw new SepeException("erro.action.participante.alterar.cracha");
            }
            getSepe().alterarParticipante(getParticipante());
            try {
                enviarEmailEdicao();
            } catch (SepeException ex) {
                logger.error(ex.getMessage(), ex);
                addActionError(getText(ex.getMessage()));
            }
            setParticipante(getSepe().buscarParticipante(getParticipante().getId()));
            getParticipante().setStatus(INSCRITO);
            getSepe().closeSessaoHibernate();
            getSepe().alterarParticipante(getParticipante());
            /**
            setAtivs19d13h(getSepe().listarAtividades("19d13h"));
            setAtivs19d19h(getSepe().listarAtividades("19d19h"));
            setAtivs20d13h(getSepe().listarAtividades("20d13h"));
            setAtivs20d19h(getSepe().listarAtividades("20d19h"));
            setAtivs21d13h(getSepe().listarAtividades("21d13h"));
            setAtivs21d19h(getSepe().listarAtividades("21d19h"));
            setAtivs22d13h(getSepe().listarAtividades("22d13h"));
            setAtivs22d19h(getSepe().listarAtividades("22d19h"));
            addActionMessage(getText("view.action.participante.edicao.sucesso"));
            setParticipante(getSepe().buscarParticipante(getParticipante().getId()));
            if (getParticipante() != null && getParticipante().getStatus().equals(INSCRITO)) {
                logger.error("erro.inscricao.participante.inscrito");
                addActionError(getText("erro.inscricao.participante.inscrito"));
                getSepe().closeSessaoHibernate();
                return INSCRICAO_OK;
            }
            getSepe().closeSessaoHibernate();**/
        } catch (SepeException ex) {
            logger.error(ex.getMessage(), ex);
            addActionError(getText(ex.getMessage()));
            return SOLICITAR_EDICAO;
        }
        setAtividades(getSepe().listarAtividades(getParticipante()));
        return INSCRICAO_OK;
    }

    public String inscreverParticipante() throws Exception {
        logger.info("inscreverParticipante()");
        try {
            atualisarAtiv19d13h();
            atualisarAtiv19d19h();
            atualisarAtiv20d13h();
            atualisarAtiv20d19h();
            atualisarAtiv21d13h();
            atualisarAtiv21d19h();
            atualisarAtiv22d13h();
            atualisarAtiv22d19h();
            setParticipante(getSepe().buscarParticipante(getParticipante().getId()));
            getParticipante().setStatus(INSCRITO);
            getSepe().closeSessaoHibernate();
            getSepe().alterarParticipante(getParticipante());
            try {
                enviarEmailInscricao();
            } catch (SepeException ex) {
                logger.error(ex.getMessage(), ex);
                addActionError(getText(ex.getMessage()));
            }
            addActionMessage(getText("view.action.participante.incricao.sucesso"));
        } catch (SepeException ex) {
            logger.error(ex.getMessage(), ex);
            addActionError(getText(ex.getMessage()));
            return SOLICITAR_INSCRICOES;
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
            addActionError(getText(ex.getMessage()));
            return SOLICITAR_INSCRICOES;
        }
        return INSCRICAO_OK;
    }

    private void atualisarAtiv19d13h() throws SepeException {
        if (getAtiv19d13h() != null && getAtiv19d13h().getId() != 0) {
            getSepe().addParticipanteAtividade(getAtiv19d13h(), getParticipante());
        }
    }

    private void atualisarAtiv19d19h() throws SepeException {
        if (getAtiv19d19h() != null && getAtiv19d19h().getId() != 0) {
            getSepe().addParticipanteAtividade(getAtiv19d19h(), getParticipante());
        }
    }

    private void atualisarAtiv20d13h() throws SepeException {
        if (getAtiv20d13h() != null && getAtiv20d13h().getId() != 0) {
            getSepe().addParticipanteAtividade(getAtiv20d13h(), getParticipante());
        }
    }

    private void atualisarAtiv20d19h() throws SepeException {
        if (getAtiv20d19h() != null && getAtiv20d19h().getId() != 0) {
            getSepe().addParticipanteAtividade(getAtiv20d19h(), getParticipante());
        }
    }

    private void atualisarAtiv21d13h() throws SepeException {
        if (getAtiv21d13h() != null && getAtiv21d13h().getId() != 0) {
            getSepe().addParticipanteAtividade(getAtiv21d13h(), getParticipante());
        }
    }

    private void atualisarAtiv21d19h() throws SepeException {
        if (getAtiv21d19h() != null && getAtiv21d19h().getId() != 0) {
            getSepe().addParticipanteAtividade(getAtiv21d19h(), getParticipante());
        }
    }

    private void atualisarAtiv22d13h() throws SepeException {
        if (getAtiv22d13h() != null && getAtiv22d13h().getId() != 0) {
            getSepe().addParticipanteAtividade(getAtiv22d13h(), getParticipante());
        }
    }

    private void atualisarAtiv22d19h() throws SepeException {
        if (getAtiv22d19h() != null && getAtiv22d19h().getId() != 0) {
            getSepe().addParticipanteAtividade(getAtiv22d19h(), getParticipante());
        }
    }

    public List<Atividade> getAtivs19d13h() {
        return ativs19d13h;
    }

    public final void setAtivs19d13h(List<Atividade> atividades) {
        this.ativs19d13h = atividades;
    }

    public Atividade getAtiv19d13h() {
        return ativ19d13h;
    }

    public void setAtiv19d13h(Atividade atividades) {
        this.ativ19d13h = atividades;
    }

    public List<Atividade> getAtivs19d19h() {
        return ativs19d19h;
    }

    public final void setAtivs19d19h(List<Atividade> atividades) {
        this.ativs19d19h = atividades;
    }

    public Atividade getAtiv19d19h() {
        return ativ19d19h;
    }

    public void setAtiv19d19h(Atividade atividades) {
        this.ativ19d19h = atividades;
    }

    public List<Atividade> getAtivs20d13h() {
        return ativs20d13h;
    }

    public final void setAtivs20d13h(List<Atividade> atividades) {
        this.ativs20d13h = atividades;
    }

    public Atividade getAtiv20d13h() {
        return ativ20d13h;
    }

    public void setAtiv20d13h(Atividade atividades) {
        this.ativ20d13h = atividades;
    }

    public List<Atividade> getAtivs20d19h() {
        return ativs20d19h;
    }

    public final void setAtivs20d19h(List<Atividade> atividades) {
        this.ativs20d19h = atividades;
    }

    public Atividade getAtiv20d19h() {
        return ativ20d19h;
    }

    public void setAtiv20d19h(Atividade atividades) {
        this.ativ20d19h = atividades;
    }

    public List<Atividade> getAtivs21d13h() {
        return ativs21d13h;
    }

    public final void setAtivs21d13h(List<Atividade> atividades) {
        this.ativs21d13h = atividades;
    }

    public Atividade getAtiv21d13h() {
        return ativ21d13h;
    }

    public void setAtiv21d13h(Atividade atividades) {
        this.ativ21d13h = atividades;
    }

    public List<Atividade> getAtivs21d19h() {
        return ativs21d19h;
    }

    public final void setAtivs21d19h(List<Atividade> atividades) {
        this.ativs21d19h = atividades;
    }

    public Atividade getAtiv21d19h() {
        return ativ21d19h;
    }

    public void setAtiv21d19h(Atividade atividades) {
        this.ativ21d19h = atividades;
    }

    public List<Atividade> getAtivs22d13h() {
        return ativs22d13h;
    }

    public final void setAtivs22d13h(List<Atividade> atividades) {
        this.ativs22d13h = atividades;
    }

    public Atividade getAtiv22d13h() {
        return ativ22d13h;
    }

    public void setAtiv22d13h(Atividade atividades) {
        this.ativ22d13h = atividades;
    }

    public List<Atividade> getAtivs22d19h() {
        return ativs22d19h;
    }

    public final void setAtivs22d19h(List<Atividade> atividades) {
        this.ativs22d19h = atividades;
    }

    public Atividade getAtiv22d19h() {
        return ativ22d19h;
    }

    public void setAtiv22d19h(Atividade atividades) {
        this.ativ22d19h = atividades;
    }

    /**
     * @return
     */
    public Integer getIdParticipante() {
        if (participante != null) {
            return participante.getId();
        }
        return null;
    }

    /**
     * @param id
     */
    public void setIdParticipante(Integer id) {
        if (participante == null) {
            participante = new Participante();
        }
        participante.setId(id);
    }

    /**
     * @return
     */
    public String getUsername() {
        return username;
    }

    /**
     * @param username
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * @return
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password
     */
    public void setPassword(String password) {
        this.password = password;
    }

    public Participante getParticipante() {
        return participante;
    }

    public void setParticipante(Participante participante) {
        this.participante = participante;
    }

    private void enviarEmailEdicao() throws SepeException {
        Email mail = new Email();
        mail.setDestino(getParticipante().getEmail());
        mail.setAssunto("[II SEPE CERES/UFRN] Dados editados com sucesso");
        mail.setConteudo(msgEdicao());

        getSepe().enviarEmail(mail);
    }

    private String msgEdicao() {
        String msg = "Prezado(a) " + participante.getNome() + ",\n\n";
        msg += "Os seus dados foram editados com sucesso. \n";
        msg += "      - E-mail: " + participante.getEmail() + "\n";
        msg += "      - Nome Crachá: " + participante.getNomeCracha() + "\n";
        msg += "      - Curso: " + participante.getCurso() + "\n";
        msg += "      - Instituição: " + participante.getInstituicao() + "\n";
        msg += "      - Titulação: " + participante.getTitulacao() + "\n";
        msg += "      - Endereço: " + participante.getRua() + ", " + participante.getNumero() + "\n";
        msg += "      - Bairro: " + participante.getBairro() + "\n";
        msg += "      - Cidade: " + participante.getCidade() + "/" + participante.getEstado()+ "\n";
        msg += "      - CEP: " + participante.getCep() + "\n";
        msg += "      - senha: " + participante.getSenha() + "\n\n";
        msg += "Para mais informa\u00e7\u00f5es sobre a II Semana de Ensino, Pesquisa e Extensão do CERES/UFRN, por favor, \n"
                + "reporte-se ao portal web do evento (" + Constantes.SITE + ").\n\n";
        msg += "Atenciosamente,\n";
        msg += "Comiss\u00e3o Organizadora II SEPE.";
        return msg;
    }
    
    private void enviarEmailInscricao() throws SepeException {
        Email mail = new Email();
        mail.setDestino(getParticipante().getEmail());
        mail.setAssunto("[II SEPE CERES/UFRN] Inscrições em Atividades");
        mail.setConteudo(msgInscricao());

        getSepe().enviarEmail(mail);
    }

    private String msgInscricao() throws SepeException {
        String msg = "Prezado(a) " + participante.getNome() + ",\n\n";
        msg += "Os dados de sua inscrição nas atividades s\u00e3o os seguinte: \n";
        msg += "      - E-mail: " + participante.getEmail() + "\n";
        if (getAtiv19d13h() != null && getAtiv19d13h().getId() != 0) {
            Atividade ativ = getSepe().buscarAtividade(getAtiv19d13h().getId());
            if (ativ != null) {
                msg += "      - Dia: 19/10 - 13:30 às 17:00\n";
                msg += "      - Título: " + ativ.getTitulo() + "\n\n";
            }
        }
        if (getAtiv19d19h() != null && getAtiv19d19h().getId() != 0) {
            Atividade ativ = getSepe().buscarAtividade(getAtiv19d19h().getId());
            if (ativ != null) {
                msg += "      - Dia: 19/10 - 19:00 às 22:00\n";
                msg += "      - Título: " + ativ.getTitulo() + "\n\n";
            }
        }
        if (getAtiv20d13h() != null && getAtiv20d13h().getId() != 0) {
            Atividade ativ = getSepe().buscarAtividade(getAtiv20d13h().getId());
            if (ativ != null) {
                msg += "      - Dia: 20/10 - 13:30 às 17:00\n";
                msg += "      - Título: " + ativ.getTitulo() + "\n\n";
            }
        }
        if (getAtiv20d19h() != null && getAtiv20d19h().getId() != 0) {
            Atividade ativ = getSepe().buscarAtividade(getAtiv20d19h().getId());
            if (ativ != null) {
                msg += "      - Dia: 20/10 - 19:00 às 22:00\n";
                msg += "      - Título: " + ativ.getTitulo() + "\n\n";
            }
        }
        if (getAtiv21d13h() != null && getAtiv21d13h().getId() != 0) {
            Atividade ativ = getSepe().buscarAtividade(getAtiv21d13h().getId());
            if (ativ != null) {
                msg += "      - Dia: 21/10 - 13:30 às 17:00\n";
                msg += "      - Título: " + ativ.getTitulo() + "\n\n";
            }
        }
        if (getAtiv21d19h() != null && getAtiv21d19h().getId() != 0) {
            Atividade ativ = getSepe().buscarAtividade(getAtiv21d19h().getId());
            if (ativ != null) {
                msg += "      - Dia: 21/10 - 19:00 às 22:00\n";
                msg += "      - Título: " + ativ.getTitulo() + "\n\n";
            }
        }
        if (getAtiv22d13h() != null && getAtiv22d13h().getId() != 0) {
            Atividade ativ = getSepe().buscarAtividade(getAtiv22d13h().getId());
            if (ativ != null) {
                msg += "      - Dia: 22/10 - 13:30 às 17:00\n";
                msg += "      - Título: " + ativ.getTitulo() + "\n\n";
            }
        }
        if (getAtiv22d19h() != null && getAtiv22d19h().getId() != 0) {
            Atividade ativ = getSepe().buscarAtividade(getAtiv22d19h().getId());
            if (ativ != null) {
                msg += "      - Dia: 22/10 - 19:00 às 17:00\n";
                msg += "      - Título: " + ativ.getTitulo() + "\n\n";
            }
        }

        msg += "As informações sobre as salas estão no portal do evento no link Programação: http://sepe.cerescaico.ufrn.br/sepe/Programacao.action \n\n";
        msg += "Para mais informa\u00e7\u00f5es sobre a II Semana de Ensino, Pesquisa e Extensão do CERES/UFRN, por favor, \n"
                + "reporte-se ao portal web do evento (" + Constantes.SITE + ").\n\n";
        msg += "Verifique se os horários, salas das atividades estão corretos!\n\n";
        msg += "Atenciosamente,\n";
        msg += "Comiss\u00e3o Organizadora II SEPE.";
        return msg;
    }

    public ArrayList<String> getUf() {
        return uf;
    }

    public void setUf(ArrayList<String> uf) {
        this.uf = uf;
    }
}
